From 3397904b3dc0f72ba3c46dbfcfb165c59cf0dc9c Mon Sep 17 00:00:00 2001 From: "awilliam@xenbuild.aw" Date: Sun, 29 Oct 2006 11:13:30 -0700 Subject: [PATCH] [IA64] fix xenperf xenperf became not to work due to xencomm. Signed-off-by: Kouya Shimura --- .../arch/ia64/xen/xcom_privcmd.c | 52 ++++++++++++++----- 1 file changed, 38 insertions(+), 14 deletions(-) diff --git a/linux-2.6-xen-sparse/arch/ia64/xen/xcom_privcmd.c b/linux-2.6-xen-sparse/arch/ia64/xen/xcom_privcmd.c index 7d50fffd51..ad1737c5b9 100644 --- a/linux-2.6-xen-sparse/arch/ia64/xen/xcom_privcmd.c +++ b/linux-2.6-xen-sparse/arch/ia64/xen/xcom_privcmd.c @@ -120,25 +120,49 @@ xencomm_privcmd_sysctl(privcmd_hypercall_t *hypercall) case XEN_SYSCTL_sched_id: break; case XEN_SYSCTL_perfc_op: - ret = xencomm_create( - xen_guest_handle(kern_op.u.perfc_op.desc), - kern_op.u.perfc_op.nr_counters * - sizeof(xen_sysctl_perfc_desc_t), - &desc, GFP_KERNEL); + { + struct xencomm_handle *tmp_desc; + xen_sysctl_t tmp_op = { + .cmd = XEN_SYSCTL_perfc_op, + .interface_version = XEN_SYSCTL_INTERFACE_VERSION, + .u.perfc_op = { + .cmd = XEN_SYSCTL_PERFCOP_query, + // .desc.p = NULL, + // .val.p = NULL, + }, + }; + + if (xen_guest_handle(kern_op.u.perfc_op.desc) == NULL) { + if (xen_guest_handle(kern_op.u.perfc_op.val) != NULL) + return -EINVAL; + break; + } + + /* query the buffer size for xencomm */ + tmp_desc = xencomm_create_inline(&tmp_op); + ret = xencomm_arch_hypercall_sysctl(tmp_desc); if (ret) return ret; - set_xen_guest_handle(kern_op.u.perfc_op.val, - (void *)desc); - ret = xencomm_create( - xen_guest_handle(kern_op.u.perfc_op.val), - kern_op.u.perfc_op.nr_vals * - sizeof(xen_sysctl_perfc_desc_t), - &desc1, GFP_KERNEL); + + ret = xencomm_create(xen_guest_handle(kern_op.u.perfc_op.desc), + tmp_op.u.perfc_op.nr_counters * + sizeof(xen_sysctl_perfc_desc_t), + &desc, GFP_KERNEL); + if (ret) + return ret; + + set_xen_guest_handle(kern_op.u.perfc_op.desc, (void *)desc); + + ret = xencomm_create(xen_guest_handle(kern_op.u.perfc_op.val), + tmp_op.u.perfc_op.nr_vals * + sizeof(xen_sysctl_perfc_val_t), + &desc1, GFP_KERNEL); if (ret) xencomm_free(desc); - set_xen_guest_handle(kern_op.u.perfc_op.val, - (void *)desc1); + + set_xen_guest_handle(kern_op.u.perfc_op.val, (void *)desc1); break; + } case XEN_SYSCTL_getdomaininfolist: ret = xencomm_create( xen_guest_handle(kern_op.u.getdomaininfolist.buffer), -- 2.30.2